#include<iostream>
#include<string>
#include<jsoncpp/json/json.h>    //这里需要把前导路径给带上
#include<memory>
#include<sstream>

//注意这里的编译 g++ testjson.cc -ljsoncpp    需要链接库(因为是第三方库   需要-l进行链接那个库)
int main()
{
//解决 {
    // "age":18,
    // "name":"\u5f20\u4e09",
    // "sex":"\u7537"
    // } 
    // 输出错误问题

//     Json::Value root;    //首先就定义一个 Json::Value 对象
//     root["name"] = "张三";
//     root["sex"] = "男";
//     root["age"] = 18;      //不需要关注内部的类型  

// //创建一个 Json::StreamWriterBuilder 对象
//     Json::StreamWriterBuilder builder;
//     builder.settings_["emitUTF8"] = true;    //设置emitUTF8 为 true   禁止Unicode转义

//     //使用 builder 创建一个 write 对象
//     std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
//     //用于存储JSON字符串 
//     std::ostringstream oss;      //转化成为stringstream流

//     writer->write(root,&oss);
//     std::string s = oss.str();
//     std::cout << s << std::endl;        //解决换行输出的那个问题




// //解决 {"age":18,"name":"\u5f20\u4e09","sex":"\u7537"}    输出错误问题
//         Json::Value root;    //首先就定义一个 Json::Value 对象
//         root["name"] = "张三";
//         root["sex"] = "男";
//         root["age"] = 18;      //不需要关注内部的类型  

// //创建一个 Json::StreamWriterBuilder 对象
//         Json::StreamWriterBuilder builder;
//         builder.settings_["emitUTF8"] = true;    //设置emitUTF8 为 true   禁止Unicode转义

//         std::string output = Json::writeString(builder,root);
//         std::cout << output << std::endl;




//     Json::Value root;    //首先就定义一个 Json::Value 对象
//     root["name"] = "张三";
//     root["sex"] = "男";
//     root["age"] = 18;      //不需要关注内部的类型  

// //多行输出字符串
//     // std::string s = root.toStyledString();   //root对象自带的 
//     // std::cout << s << std::endl;    //把上面的key  value风格的内容转成   这样的字符串

// //单行输出字符串
//     // Json::FastWriter writer;       //去掉了换行符   网络传送的数据量小   效率稍高
//     // std::string s = writer.write(root);
//     // std::cout << s << std::endl; 

// //风格式的写入
//     // Json::StyledWriter writer;    //用\n  给我们进行按行设置   可读性较好
//     // std::string s = writer.write(root);
//     // std::cout << s <<std::endl;
 



//注：结构化数据要序列化就要交给Json::Value    得到序列化之后的字符串
//后面反序列化就要从 Json::Value 转化成为之前的

//反序列化
    std::string json_string  = "{\"name\":\"张三\",\"age\":30,\"city\":\"北京\"}";

//反序列化   起手 Json::Value
    Json::Value root;
    Json::Reader reader;

    bool ok = reader.parse(json_string,root);    //反序列化用reader对象里的parse函数   参数一：字符串   参数二：反序列化到哪里
    (void)ok;

//把序列化字符串  反序列化到了Json::Value里面
    std::string name = root["name"].asString();
    int age = root["age"].asInt();
    std::string city = root["city"].asString();

    std::cout << name << std::endl;
    std::cout << age << std::endl;
    std::cout << city << std::endl;

    return 0;
}

